home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3c4.s < prev    next >
Text File  |  1994-10-30  |  6KB  |  177 lines

  1.  
  2. ; Lezione3c4.s    ; BARRETTA CHE SCENDE FATTA CON MOVE&WAIT DEL COPPER
  3.         ; (PER FARLA SCENDERE USATE IL TASTO DESTRO DEL MOUSE)
  4.  
  5. ;    In questo listato viene fatta scendere una vera e propria
  6. ;    barra sfumata composta di 10 wait, dunque si agisce su 10 wait!
  7. ;    La differenza con Lezione3c3.s sta nell'utilizzo di una sola label
  8. ;    BARRA anziche' di 10 label, grazie alla distanza di indirizzamento.
  9.  
  10.     SECTION    BarraRossa,CODE    ; anche in Fast va bene
  11.  
  12. Inizio:
  13.     move.l    4.w,a6        ; Execbase in a6
  14.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  15.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  16.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  17.                 ; le librerie, e da in uscita l'indirizzo
  18.                 ; di base di quella libreria da cui fare le
  19.                 ; distanze di indirizzamento (Offset)
  20.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  21.     move.l    d0,a6
  22.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  23.                 ; di sistema
  24.     move.l    #COPPERLIST,$dff080    ; COP1LC - Puntiamo la nostra COP
  25.     move.w    d0,$dff088        ; COPJMP1 - Facciamo partire la COP
  26. mouse:
  27.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  28.     bne.s    mouse        ; Se non ancora, non andare avanti
  29.  
  30.     btst    #2,$dff016    ; POTINP - Tasto destro del mouse premuto?
  31.     bne.s    Aspetta        ; Se no, non eseguire Muovicopper
  32.  
  33.     bsr.s    MuoviCopper    ; Sempre piu' difficile
  34.  
  35. Aspetta:
  36.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  37.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta la linea
  38.                 ; seguente, altrimenti MuoviCopper viene
  39.                 ; rieseguito
  40.  
  41.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  42.     bne.s    mouse        ; se no, torna a mouse:
  43.  
  44.     move.l    OldCop(PC),$dff080    ; COP1LC - Puntiamo la cop di sistema
  45.     move.w    d0,$dff088        ; COPJMP1 - facciamo partire la cop
  46.  
  47.     move.l    4.w,a6
  48.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  49.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  50.                 ; (vanno aperte e chiuse le librerie!!!)
  51.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  52.     rts
  53.  
  54.  
  55. ;    Questa routine sposta una barra composta di 10 wait
  56.  
  57. MuoviCopper:
  58.     LEA    BARRA,a0    ; mettiamo in a0 l'indirizzo di BARRA:
  59.     cmpi.b    #$fc,8*9(a0)    ; siamo arrivati alla linea $fc?
  60.     beq.s    Finito        ; se si, siamo in fondo e non continuiamo
  61.     addq.b    #1,(a0)        ; WAIT 1 cambiato (indiretto senza distanza)
  62.     addq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  63.     addq.b    #1,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes, infatti
  64.     addq.b    #1,8*3(a0)    ; dc.w $xx07,$FFFE,$180,$xxx e' una long.
  65.     addq.b    #1,8*4(a0)    ; se quindi dall'indirizzo del primo wait
  66.     addq.b    #1,8*5(a0)    ; facciamo una distanza di indirizzamento di
  67.     addq.b    #1,8*6(a0)    ; 8 modifichiamo il dc.w $xx07,$fffe seguente.
  68.     addq.b    #1,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  69.     addq.b    #1,8*8(a0)    ; barra rossa ogni volta per farla scendere!
  70.     addq.b    #1,8*9(a0)    ; ultimo wait! (il BARRA10 del sorgente prec.)
  71. Finito:
  72.     rts    ; P.S: Con questo RTS si torna al ciclo MOUSE che aspetta
  73.         ; per la temporizzazione.
  74.  
  75. ;    NOTA: "*" significa "moltiplicato", "/" significa "diviso"
  76.  
  77.     ; dati
  78.  
  79. GfxName:
  80.     dc.b    "graphics.library",0,0    ; NOTA: per mettere in memoria
  81.                     ; dei caratteri usare sempre il dc.b
  82.                     ; e metterli tra "", oppure ''
  83.  
  84. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  85.     dc.l    0    ; della graphics.library
  86.  
  87. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  88.     dc.l    0
  89.  
  90.     SECTION    GRAPHIC,DATA_C    ; Le copperlist DEVONO essere in CHIP RAM!
  91.  
  92. COPPERLIST:
  93.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  94.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  95.  
  96. BARRA:
  97.     dc.w    $7907,$FFFE    ; WAIT - aspetto la linea $79
  98.     dc.w    $180,$300    ; COLOR0 - inizio la barra rossa: rosso a 3
  99.     dc.w    $7a07,$FFFE    ; WAIT - linea seguente
  100.     dc.w    $180,$600    ; COLOR0 -rosso a 6
  101.     dc.w    $7b07,$FFFE
  102.     dc.w    $180,$900    ; rosso a 9
  103.     dc.w    $7c07,$FFFE
  104.     dc.w    $180,$c00    ; rosso a 12
  105.     dc.w    $7d07,$FFFE
  106.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  107.     dc.w    $7e07,$FFFE
  108.     dc.w    $180,$c00    ; rosso a 12
  109.     dc.w    $7f07,$FFFE
  110.     dc.w    $180,$900    ; rosso a 9
  111.     dc.w    $8007,$FFFE
  112.     dc.w    $180,$600    ; rosso a 6
  113.     dc.w    $8107,$FFFE
  114.     dc.w    $180,$300    ; rosso a 3
  115.     dc.w    $8207,$FFFE
  116.     dc.w    $180,$000    ; colore NERO
  117.  
  118.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  119.  
  120.  
  121.     end
  122.  
  123. Per far scendere la barra basta cambiare la COPPERLIST, in particolare
  124. in questo esempio vengono cambiati i vari WAIT che compongono la barra, nel
  125. loro primo byte, ossia quello che definisce la linea verticale da attendere:
  126.  
  127. BARRA:
  128.     dc.w    $7907,$FFFE    ; WAIT - aspetto la linea $79
  129.     dc.w    $180,$300    ; COLOR0 - inizio la barra rossa: rosso a 3
  130.     dc.w    $7a07,$FFFE    ; linea seguente
  131.     dc.w    $180,$600    ; rosso a 6
  132.     ...
  133.  
  134. Mettendo una label a quel byte, si puo' cambiare quel byte agendo sulla
  135. label stessa, in questo caso BARRA. Pero' la barra in questione e' fatta
  136. di 9 wait+color0, quindi per "spostarla" bisogna cambiare tutti e 9 i
  137. wait, mentre i color0 (dc.w $180,$xxx) che si trovano sotto i wait rimangono
  138. inalterati. Per raggiungere tutti e 9 i WAIT, anziche' mettere una LABEL
  139. a tutti, e' piu' veloce caricare l'indirizzo del primo in un registro e
  140. cambiare gli altri facendo delle distanze di indirizzamento:
  141.  
  142. MuoviCopper:
  143.     LEA    BARRA,a0
  144.     cmpi.b    #$fc,8*9(a0)    ; controlliamo l'ultimo wait, quello che
  145.     beq.s    Finito        ; definisce la parte inferiore della barra.
  146.     addq.b    #1,(a0)        ; cambio BARRA:
  147.     addq.b    #1,8(a0)    ; cambio il byte 2 long dopo BARRA:
  148.     addq.b    #1,8*2(a0)    ; cambio il byte 4 long dopo BARRA:
  149.     addq.b    #1,8*3(a0)    ; cambio il byte 6 long dopo...
  150.     addq.b    #1,8*4(a0)
  151.     addq.b    #1,8*5(a0)
  152.     addq.b    #1,8*6(a0)
  153.     addq.b    #1,8*7(a0)
  154.     addq.b    #1,8*8(a0)
  155.     addq.b    #1,8*9(a0)
  156. Finito:
  157.     rts
  158.  
  159. NOTA: Provate a fare un "D MuoviCopper", e verificherete che gli 8*2,8*3 etc.
  160. sono assemblati come:
  161.  
  162.     ADDQ.B    #1,$8(A0)
  163.     ADDQ.B    #1,$10(A0)
  164.     ADDQ.B    #1,$18(A0)
  165.     ADDQ.B    #1,$20(A0)
  166.     ADDQ.B    #1,$28(A0)
  167.  
  168. Ossia con il risultato di 8*2 (ossia 16, ovvero $10), di 8*3 ($18)...
  169.  
  170. Come ultima modifica, provate a cambiare il $fc della linea
  171.  
  172.     cmpi.b    #$fc,8*9(a0)
  173.  
  174. Mettendoci valori inferiori, e verificherete che la barra scende fino alla
  175. linea che specificate.
  176.  
  177.